#include <bits/stdc++.h>
#define gc getchar
#define pc putchar
#define pt printf
#define IL inline
using namespace std;
const int Mxn=1005,P=998244353;
int N,K,Fa[Mxn],R[Mxn][Mxn],C[Mxn][Mxn],F[Mxn][Mxn];
int Ct,Hd[Mxn],Nt[Mxn<<1],To[Mxn<<1];
IL int _() {
	int x=0,f=0;char ch=gc();
	while(ch<'0'||ch>'9') f|=(ch=='-'),ch=gc();
	while(ch>='0'&&ch<='9') x=(x<<1)+(x<<3)+(ch^48),ch=gc();
	return f?-x:x;
}
IL void __(int x) {
	int stk[30],tp=0;
	if(x<0) x=-x,pc('-');
	do stk[++tp]=x%10,x/=10;while(x);
	while(tp) pc(stk[tp--]^48);
}
int Max(int x,int y) {return x>y?x:y;}
int Min(int x,int y) {return x<y?x:y;}
void Add(int &x,int y) {x=x+y<P?x+y:x+y-P;}
int Find(int x) {return x==Fa[x]?x:Fa[x]=Find(Fa[x]);}
void Union(int x,int y) {x=Find(x),y=Find(y),Fa[x]=y;}
bool Check(int l,int r) {
	for(int i=l;i<r;++i) if(R[i][r]) Union(i,r);
	for(int i=l;i<r;++i) if(Find(i)!=Find(i+1)) return 0;
	return 1;
}
void Get(int x,int y) {
//	pt("Get:%d %d\n",x,y);
	for(int i=1;i<=K;++i) Add(F[x][i],F[y-1][i-1]);
}
signed main() {
	freopen("soft.in","r",stdin);
	freopen("soft.out","w",stdout);
	N=_(),K=_();
	for(int a,b,i=1;i<N;++i) 
		a=_(),b=_(),R[a][b]=1,R[b][a]=1;
	for(int i=1;i<=N;++i) {
		for(int k=i;k<=N;++k) {
			Fa[k]=k;
			C[i][k]=Check(i,k);
		}
	}
//	for(int i=1;i<=N;++i) {
//		for(int k=i;k<=N;++k) {
//			pt("[%d %d] %d\n",i,k,C[i][k]);
//		}
//	}
	F[0][0]=1;
	for(int i=1;i<=N;++i) {
		for(int k=1;k<=i;++k) {
			if(!C[k][i]) continue;
			Get(i,k);
		}
	}
//	for(int i=1;i<=N;++i) {
//		for(int k=1;k<=K;++k) {
//			pt("<%d %d> %d\n",i,k,F[i][k]);
//		}
//	}
	for(int i=1;i<=K;++i) __(F[N][i]),pc('\n');
	return 0;
}
